﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using AdminCondominio.Dominio; 

namespace AdminCondominio.Persistencia
{
    public class CuotaDAO
    {
                
        private SqlConnection _Conexion = null;

        public CuotaDAO()
        {
            // Instanciamos el objeto conexión
            //_Conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["cn"].ConnectionString);
            //_Conexion = new SqlConnection(@"Data Source=192.168.1.15;Initial Catalog=WST;Persist Security Info=True;User ID=sa;Password=infonet");
            //_Conexion = new SqlConnection(@"Data Source=localhost;Initial Catalog=BdCondominio;Persist Security Info=True;User ID=sa;Password=");
            _Conexion = new SqlConnection(@"Data Source=localhost;Initial Catalog=BdCondominio;Persist Security Info=True;User ID=sa;Password=");
        }

        /// <summary>
        /// Crea una nueva cuota para una vivienda
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public Cuota Crear(Cuota value)
        {
            //cambiar la el tamaño del campo "Importe" en al base (18,5), modificar la tabla para que acepte null campos (CoTipoPago,FecPago)
            try
            {
                Cuota cuotaCreado = null;

                //Validar que no exista ninguna cuota para la vivienda y el periodo en que se va a registrar
                cuotaCreado = this.obtener(value.Vivienda.CoVivienda, value.TxPeriodo);

                //Se registrar si no existe el registro
                if (cuotaCreado == null)
                {
                    SqlCommand _cmd = new SqlCommand();
                    _cmd.CommandType = CommandType.Text;
                    _cmd.Connection = _Conexion;
                    //_cmd.CommandText = @"INSERT INTO cuota(CoVivienda,TxPeriodo,Importe,FeVencimiento,Estado,CoTipoPago,FecPago) VALUES(@CoVivienda,@TxPeriodo,@Importe,@FeVencimiento,@Estado,@CoTipoPago,@FecPago)";
                    _cmd.CommandText = @"INSERT INTO cuota(CoVivienda,TxPeriodo,Importe,FeVencimiento,Estado) VALUES(@CoVivienda,@TxPeriodo,@Importe,@FeVencimiento,@Estado)";
                    _cmd.Parameters.Add("@CoVivienda", SqlDbType.Int, 4).Value = value.Vivienda.CoVivienda;
                    _cmd.Parameters.Add("@TxPeriodo", SqlDbType.VarChar, 10).Value = value.TxPeriodo;
                    _cmd.Parameters.Add("@Importe", SqlDbType.Decimal).Value = value.Importe;
                    _cmd.Parameters.Add("@FeVencimiento", SqlDbType.DateTime).Value = value.FeVencimiento;
                    _cmd.Parameters.Add("@Estado", SqlDbType.VarChar, 5).Value = value.Estado;
                    //_cmd.Parameters.Add("@CoTipoPago", SqlDbType.Int, 4).Value = value.TipoPago.CoTipoPago;
                    //_cmd.Parameters.Add("@FecPago", SqlDbType.DateTime).Value = value.FecPago;
                    _Conexion.Open();
                    int rows = _cmd.ExecuteNonQuery();
                    _Conexion.Close();
                    _cmd.Dispose();
                    if (rows > 0)
                    {
                        cuotaCreado = this.obtener(value.Vivienda.CoVivienda, value.TxPeriodo);
                        cuotaCreado.mensaje = "OK.";
                    }
                }
                else
                {
                    cuotaCreado = new Cuota();
                    cuotaCreado.mensaje = "Ya se encruentra registrada la cuota para la vivienda" + value.Vivienda.CoVivienda.ToString() + " y el periodo " + value.TxPeriodo;
                }
                return cuotaCreado;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Recupera la cuota generada por el id
        /// </summary>
        /// <param name="CoCuota"></param>
        /// <returns></returns>
        public Cuota obtener(int CoVivienda, string TxPeriodo)
        {
            try
            {
                Cuota cuotaObtenida = null;
                _Conexion.Open();
                String _Sentencia = @"SELECT * FROM cuota WHERE CoVivienda =" + CoVivienda.ToString() + " AND TxPeriodo = '" + TxPeriodo + "'";
                SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion);
                SqlDataReader resultado = _Comando.ExecuteReader();
                if (resultado.Read())
                {
                    cuotaObtenida = new Cuota();
                    cuotaObtenida.CoCuota = (int)resultado["CoCuota"];
                    cuotaObtenida.Vivienda = new Vivienda();
                    cuotaObtenida.Vivienda.CoVivienda = (int)resultado["CoVivienda"];
                    cuotaObtenida.TxPeriodo = (String)resultado["TxPeriodo"];
                    cuotaObtenida.Importe = (decimal)resultado["Importe"];
                    cuotaObtenida.FeVencimiento = (DateTime)resultado["FeVencimiento"];
                    cuotaObtenida.Estado = (String)resultado["Estado"];
                    //cuotaObtenida.TipoPago = new TipoPago();
                    //cuotaObtenida.TipoPago.CoTipoPago = (int)resultado["CoTipoPago"];
                    //cuotaObtenida.FecPago = (DateTime)resultado["FecPago"];
                }
                _Conexion.Close();
                return cuotaObtenida;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Obtiene el listado de coutas pendientes de la vivienda
        /// </summary>
        /// <param name="CoVivienda"></param>
        /// <returns></returns>
        public ICollection<Cuota> listarCuotasPendientes(int CoVivienda,string estado)
        {
            try
            {
                List<Cuota> listCuotas = new List<Cuota>();
                Cuota cuota = null;
                _Conexion.Open();

                //String _Sentencia = @"SELECT CoCuota,CoVivienda,TxPeriodo,Importe,FeVencimiento,Estado,'CoTipoPago'=ISNULL(CoTipoPago,0),'FecPago'=ISNULL(FecPago,'1900-01-01 00:00:00.000') FROM cuota WHERE CoVivienda =" + CoVivienda.ToString() + (!string.IsNullOrEmpty(estado.Trim()) ? " AND estado='" + estado.Trim() + "' " : string.Empty);
                String _Sentencia = @"SELECT CoCuota,CoVivienda,TxPeriodo,Importe,FeVencimiento,Estado,'CoTipoPago'=ISNULL(p.TxDescripcion,''),'FecPago'=ISNULL(FecPago,'1900-01-01 00:00:00.000') FROM cuota c LEFT JOIN tipo_pago p ON (c.CoTipoPago=p.CoTipoPago) WHERE CoVivienda =" + CoVivienda.ToString() + (!string.IsNullOrEmpty(estado.Trim()) ? " AND estado='" + estado.Trim() + "' " : string.Empty) + " Order by txperiodo";
                SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion);
                SqlDataReader resultado = _Comando.ExecuteReader();
                while (resultado.Read())
                {
                    cuota = new Cuota();
                    cuota.CoCuota = (int)resultado["CoCuota"];
                    cuota.Vivienda = new Vivienda();
                    cuota.Vivienda.CoVivienda = (int)resultado["CoVivienda"];
                    cuota.TxPeriodo = (String)resultado["TxPeriodo"];
                    cuota.Importe = (decimal)resultado["Importe"];
                    cuota.FeVencimiento = (DateTime)resultado["FeVencimiento"];
                    cuota.Estado = (String)resultado["Estado"];
                    cuota.TipoPago = new TipoPago();
                    if ((string)resultado["CoTipoPago"] != string.Empty)
                        cuota.TipoPago.TxDescripcion = (string)resultado["CoTipoPago"];
                    if (resultado["FecPago"].ToString() != "01/01/1900 12:00:00 a.m.")
                        cuota.FecPago = (DateTime)resultado["FecPago"];
                    listCuotas.Add(cuota);
                }
                _Conexion.Close();
                return listCuotas;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Actualiza la tabla cuota de la vivienda(Pago de la couta)
        /// </summary>
        /// <param name="cuotaAModificar"></param>
        /// <returns></returns>
        public ICollection<Cuota> modificar(Cuota cuotaAModificar)
        {
            try
            {
                ICollection<Cuota> cuotaPagada = null;
                _Conexion.Open();
                String _Sentencia = string.Format(@"UPDATE cuota SET estado ='{0}', cotipopago ={3}, fecpago= '{4}' WHERE cocuota={1} and txperiodo='{2}'", cuotaAModificar.Estado, cuotaAModificar.CoCuota, cuotaAModificar.TxPeriodo.Trim(), cuotaAModificar.TipoPago.CoTipoPago, cuotaAModificar.FecPago.Value.ToString("yyyy-MM-dd"));
                SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion);
                int rows = _Comando.ExecuteNonQuery();
                _Conexion.Close();
                if (rows > 0)
                {
                    cuotaPagada = this.listarCuotasPendientes(cuotaAModificar.Vivienda.CoVivienda, "P");
                    //cuotaPagada.mensaje = "OK.";
                }
                return cuotaPagada;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public List<Vivienda> ListarCuotaxResidente(string CoResidente)
        {
            //_Conexion.Open();
            String _Sentencia = @"select Vi.CoVivienda,Ubicacion,TiVivienda,TxPeriodo,Importe,CoCuota,FeVencimiento from vivienda vi inner join cuota cu on cu.CoVivienda = vi.CoVivienda inner join residente res on res.CoResidente=vi.CoResidente where Estado='P' AND res.NoCorreo='" + CoResidente.ToString() + "'";

            SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion);
            _Comando.Connection.Open();
            SqlDataReader resultado = _Comando.ExecuteReader();
            List<Vivienda> _LisVivienda = new List<Vivienda>();
            while (resultado.Read())
            {
                Vivienda _Vivienda = new Vivienda();
                _Vivienda.Cuota = new Cuota();
                _Vivienda.CoVivienda = (int)resultado["CoCuota"];
                _Vivienda.Ubicacion = (String)resultado["CoVivienda"];
                _Vivienda.TiVivienda = (String)resultado["CoVivienda"];
                _Vivienda.Cuota.TxPeriodo = (String)resultado["TxPeriodo"];
                _Vivienda.Cuota.Importe = (decimal)resultado["Importe"];
                _Vivienda.Cuota.CoCuota = (Int32)resultado["FeVencimiento"];
                _LisVivienda.Add(_Vivienda);
            }
            //  _Conexion.Close();
            _Comando.Connection.Close();

            return _LisVivienda;
        }
    }
}